home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / xbmath.has < prev    next >
Text File  |  1996-02-02  |  36KB  |  2,248 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xbmath.has  ……   ぺけ-BASICの数式評価(コンパイラ)
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.  
  9.     .include    fefunc.h
  10.  
  11.     .include    variable.h
  12.  
  13.     .xref    hash
  14.     .xref    first_check_a5_in_line
  15.     .xref    error
  16.     .xref    errors
  17.  
  18.     .xref    fnc書替sub
  19.  
  20.     .text
  21.     .even
  22.  
  23.  
  24.  * 他の変数名と重なってないかどうか
  25.  *         d4.l = * (hash.w)(文字数-1)
  26.  *         a2.l = 元の対象の開始アドレス
  27.     .xdef    variable_check
  28. variable_check:
  29.  * 重なってない        d2.l    = -1
  30.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  31.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  32.  * char の n 番と一致    d2.l    = n+0200
  33.  * float の n 番と一致    d2.l    = n+8000
  34.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  35.  * d0 =   0 : 普通の変数
  36.  *      1 : 配列    ( a0 = その配列情報のポインタ )
  37.  *    $80 : auto 変数
  38.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ )
  39.  *     -1 : 当たりなし
  40.  
  41.     lea.l    system変数,a3
  42.     moveq    #8-1,d2        * system変数の個数
  43. sysvar_check_loop:
  44.     cmp.l    (a3),d4
  45.     addq.l    #8,a3
  46. scl0:
  47.     dbeq    d2,sysvar_check_loop
  48.     bne    scl1
  49.  
  50.     movea.l    -8+4(a3),a0
  51.     movea.l    a2,a1
  52.     move.w    d4,d1
  53. @@:
  54.     cmp.b    (a1)+,(a0)+
  55.     dbne    d1,@b
  56.     bne    scl0
  57.  
  58.      * 当たり
  59.         subq.w    #4,d2        * str 型の system変数番号
  60.         bcc    int_sys_var
  61.         cmpi.w    #-4,d2        * 'inkey$'
  62.         bne    1f
  63.  
  64.         cmpi.b    #'(',(a5)
  65.         bne    @f
  66.         addq.l    #1,a5
  67.         bsr    first_check_a5_in_line
  68.         cmpi.b    #'0',(a5)+
  69.         bne    式err
  70.         bsr    first_check_a5_in_line
  71.         cmpi.b    #')',(a5)+
  72.         bne    式err
  73.         subq.w    #1,d2        * 'inkey$(0)' = -5
  74. @@:
  75.         bsr    fnc書替sub
  76. 1:
  77.         swap    d2
  78.         move.w    #$0100,d2    * str
  79.         bra    vc_end
  80.  
  81. int_sys_var:
  82.         subq.w    #4,d2        * int 型の system変数番号
  83.         swap    d2
  84.         clr.w    d2        * int
  85.         bra    vc_end
  86.  
  87.  
  88.  
  89. scl1:
  90.     tst.b    d7
  91.     bpl    global_var_check
  92.  
  93.     moveq    #8,d3        * 1項目辺りのサイズ(普通の変数用)
  94.  
  95.     lea.l    AUTOint,a3
  96.     bsr    _check
  97.     bge    vcA_end
  98.     lea.l    AUTOstr,a3
  99.     bsr    _check
  100.     bmi    @f
  101.     move.w    #$0100,d2
  102.     bra    vcA_end
  103. @@:
  104.     lea.l    AUTOfloat,a3
  105.     bsr    _check
  106.     bmi    @f
  107.     move.w    #$8000,d2
  108.     bra    vcA_end
  109. @@:
  110.     lea.l    AUTOchar,a3
  111.     bsr    _check
  112.     bmi    @f
  113.     move.w    #$0200,d2
  114. vcA_end:
  115.     move.w    #$0080,d0        * auto 変数
  116.     rts
  117.  
  118. @@:
  119.     moveq    #$20,d3        * 1項目辺りのサイズ(配列用)
  120.  
  121.     tst.b    d7
  122.     bpl    global_var_check
  123.     lea.l    AUTO配列,a3
  124.     bsr    _check
  125.     bmi    global_var_check
  126.     move.w    8(a0),d2    * 型
  127. *    move.w    12(a0),d1    * 添え字の最大数(1次元目)
  128.     move.w    #$0081,d0    * auto 配列
  129.     rts
  130.  
  131.  
  132.  
  133. global_var_check:
  134.     moveq    #8,d3        * 1項目辺りのサイズ(普通の変数用)
  135.  
  136.     lea.l    変数int,a3
  137.     bsr    _check
  138.     bge    vc_end
  139.     lea.l    変数str,a3
  140.     bsr    _check
  141.     bmi    @f
  142.     move.w    #$0100,d2
  143.     bra    vc_end
  144. @@:
  145.     lea.l    変数float,a3
  146.     bsr    _check
  147.     bmi    @f
  148.     move.w    #$8000,d2
  149.     bra    vc_end
  150. @@:
  151.     lea.l    変数char,a3
  152.     bsr    _check
  153.     bmi    global_dim_check
  154.     move.w    #$0200,d2
  155. vc_end:
  156.     moveq    #0,d0        * 普通の変数
  157.     rts
  158.  
  159.  
  160. global_dim_check:
  161.     moveq    #$20,d3        * 1項目辺りのサイズ(配列用)
  162.  
  163.     lea.l    配列,a3
  164.     bsr    _check
  165.     bmi    変数当たりなし
  166.     move.w    8(a0),d2    * 型
  167. *    move.w    12(a0),d1    * 添え字の最大数
  168.     moveq    #1,d0        * 配列
  169.     rts
  170.  
  171.  
  172. 変数当たりなし:
  173.     moveq    #-1,d0        * 当たりなし
  174.     rts
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  * d3 = 1項目辺りのサイズ(普通の変数 = 8 , 配列 = $20 )
  185. _check:
  186.  * d2.upper.w = 当たった変数番号 ( -1 = 当たりなし )
  187.     movea.l    (a3)+,a0
  188.     move.w    (a3),d2        * 登録されている変数の個数 - 1
  189.     bmi    _check_path
  190.  
  191.     move.w    d2,d0
  192.     moveq    #変数個数,d5
  193. _check_loop:
  194.     cmp.l    (a0),d4        * (hash.w)(文字数-1)
  195.     bne    c_next
  196.     movea.l    4(a0),a3
  197.     movea.l    a2,a1
  198.     move.w    d4,d1
  199. @@:
  200.     cmp.b    (a1)+,(a3)+
  201.     dbne    d1,@b
  202.     beq    _check_合致
  203. c_next:
  204.     adda.w    d3,a0
  205.     subq.w    #1,d5
  206.     dbeq    d0,_check_loop
  207.     bne    _check_path
  208.     moveq    #変数個数,d5
  209.     movea.l    (a0),a0        * 次の鎖
  210.     dbra    d0,_check_loop
  211. _check_path:
  212.     moveq    #-1,d2
  213.     rts
  214.  
  215. _check_合致:
  216.     sub.w    d0,d2
  217.     swap    d2
  218.     clr.w    d2
  219.     rts
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  *         d4.l = * (hash.w)(文字数-1)
  233.  *         a2.l = 元の対象の開始アドレス
  234.     .xdef    function_check
  235. function_check:
  236.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  237.  *    = $8000  float
  238.  *    = $8001  int
  239.  *    = $8002  char    新設
  240.  *    = $8003  str
  241.  *    = $ffff  void
  242.  * d0.w < 0 の時
  243.  *    d1.w = 引き数の個数
  244.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数 )
  245.  *    a2   = パラメーターテーブル
  246.  
  247.     move.w    内部関数個数,d5
  248.     bmi    @f
  249.     movea.l    内部関数buf,a3
  250.     bsr    fncchk_loop
  251. *    tst.w    d0
  252.     beq    @f
  253.     move.w    d5,d3
  254.     sub.w    内部関数個数,d3        * 内部関数番号 (<0)
  255.     subq.w    #1,d3
  256.     rts
  257. @@:
  258.     lea.l    外部functable,a0
  259.     move.l    d4,d0
  260.     swap    d0
  261.     clr.w    d3
  262.     move.b    d0,d3
  263.     lsl.w    #2,d3
  264.     add.w    d3,a0
  265.     move.w    (a0)+,d3    * 関数buf からのオフセット
  266.     move.w    (a0)+,d5    * 個数
  267.     bmi    fnc無し
  268.     movea.l    関数buf,a3
  269.     adda.w    d3,a3
  270.     lsr.w    #4,d3
  271.     add.w    d5,d3
  272.     bsr    fncchk_loop
  273.     sub.w    d5,d3            * 関数番号(あれば)
  274.     rts
  275.  
  276.  
  277. **    **
  278. fncchk_loop:
  279.     cmp.l    (a3),d4
  280.     lea.l    $10(a3),a3
  281. fncchk_loop0:
  282.     dbeq    d5,fncchk_loop
  283.     bne    fnc無し
  284.     move.l    a2,a0
  285.     move.l    -$10+4(a3),a1    * 関数名
  286.     move.w    d4,d0
  287. @@:
  288.     cmp.b    (a0)+,(a1)+
  289.     dbne    d0,@b
  290.     bne    fncchk_loop0
  291.  
  292.  * 当たり!
  293.     movea.l    -$10+8(a3),a2    * パラメーターテーブル
  294.     movea.l    a2,a0
  295.     moveq    #-1,d1
  296. @@:
  297.     addq.w    #1,d1
  298.     move.w    (a0)+,d0
  299.     bge    @b        * 関数の返り値(負の値)
  300.     cmpi.w    #$8080,d0    * 配列拡張
  301.     bne    1f
  302.         moveq    #$f,d0
  303.         and.w    (a0)+,d0    * (型+) 次元 - 1
  304.         add.w    d0,d0
  305.         lea.l    2+2(a0,d0.w),a0    * 添字指定フラグと次元だけの添字の大きさ飛ばす
  306.         bra    @b
  307.  
  308. 1:
  309. *    subq.w    #1,d1        * 引き数の個数
  310.     rts
  311.  
  312.  
  313. fnc無し:
  314.     moveq    #0,d0
  315.     rts
  316.  
  317.  
  318.  
  319.  
  320. **    **    **    **    **    **    **    **
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.     .xdef    system変数table作成
  332. system変数table作成:
  333.     lea.l    system変数,a4
  334.     moveq    #8-1,d6        * system変数の個数
  335.     lea.l    システム変数(pc),a5
  336. sysvar_loop:
  337.     bsr    hash
  338.  * a2.l = 元の対象の開始アドレス
  339.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  340.  * d4.l = (hash.w)(文字数 - 1)
  341.  * d1.b = お次の文字 ( $00 )
  342.  
  343.     move.l    d4,(a4)+    * (hash.w)(文字数 - 1)
  344.     move.l    a2,(a4)+    * 名前
  345.  
  346.     addq.l    #1,a5
  347.  
  348.     dbra    d6,sysvar_loop
  349.     rts
  350.  
  351.  
  352.  
  353.  
  354. システム変数:
  355.     .dc.b    'csrlin',0    * int -1
  356.     .dc.b    'errno',0    * int -2
  357.     .dc.b    'free',0    * int -3
  358.     .dc.b    'pos',0     * int -4
  359.  
  360.     .dc.b    'date$',0    * str -1
  361.     .dc.b    'day$',0    * str -2
  362.     .dc.b    'time$',0    * str -3
  363.     .dc.b    'inkey$',0    * str -4
  364.     .dc.b    0
  365.     .even
  366.  
  367. **    **    **    **    **    **    **    **
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  * 演算子チェック
  388.  * 演算子だったら    d0.w = 演算子番号+優先順位
  389.  * 違ったら        d0.w = 0
  390.  * プログラム終了なら    d0.w = -1
  391.     .xdef    cal_check
  392. cal_check:
  393.  * まず、空白(9,32)を飛ばして、先頭の文字を見る。
  394.     bsr    first_check_a5_in_line
  395.  * 数字なら            d0 = 0
  396.  * 行の終わりなら        d0 = -1
  397.  * その他なら            d0 = そのキャラクタ
  398.     tst.w    d0
  399.     ble    cal_check_end0
  400.     cmpi.b    #'/',d0            * 注釈
  401.     bne    @f
  402.     cmpi.b    #'*',1(a5)
  403.     beq    cal_check_end000        * 注釈なら演算子ではない
  404. @@:
  405.  
  406.     lea.l    _m1(pc),a0
  407.     moveq    #8-1,d1
  408. @@:
  409.     cmp.b    (a0)+,d0
  410.     dbeq    d1,@b
  411.     bne    no_simple_cal
  412.     add.w    d1,d1
  413.     move.w    _moji1(pc,d1.w),d0
  414.     cmpi.w    #6*2,d1
  415.     bcs    cal_check_end
  416.     beq    smaller
  417.     cmpi.b    #'=',1(a5)
  418.     bne    cal_check_end
  419.     move.w    #$0e0a,d0        * '>='
  420.     addq.l    #2,a5
  421.     rts
  422. smaller:
  423.     cmpi.b    #'>',1(a5)
  424.     beq    not_equal
  425.     cmpi.b    #'=',1(a5)
  426.     bne    cal_check_end
  427.     move.w    #$0d0a,d0        * '<='
  428.     addq.l    #2,a5
  429.     rts
  430. not_equal:
  431.     move.w    #$0a0a,d0        * '<>'
  432.     addq.l    #2,a5
  433.     rts
  434. cal_check_end:
  435.     addq.l    #1,a5
  436. cal_check_end0:
  437.     rts
  438. cal_check_end000:
  439.     moveq    #0,d0
  440.     rts
  441. _moji1:
  442.     .dc.w    $0101        * '*'
  443.     .dc.w    $0201        * '/'
  444.     .dc.w    $0302        * '\'
  445.     .dc.w    $0504        * '+'
  446.     .dc.w    $0604        * '-'
  447.     .dc.w    $090a        * '='
  448.     .dc.w    $0b0a        * '<'
  449.     .dc.w    $0c0a        * '>'
  450. _m1:
  451.     .dc.b    '><=-+\/*'
  452.     *     76543210
  453.  
  454.  
  455.  
  456.  
  457. no_simple_cal:
  458.     lea.l    _cp_cal(pc),a1
  459.     lea.l    _cp_calS(pc),a2
  460.     moveq    #7-1,d1
  461. @@:
  462.     bsr    one_check
  463.     beq    @f
  464.     addq.l    #2,a1
  465.     dbra    d1,@b
  466.     moveq    #0,d0
  467.     rts
  468.  
  469. @@:
  470.     move.w    (a1),d0
  471.     rts
  472.  
  473.  
  474. _cp_cal:
  475.     .dc.w    $1112        * 'or'
  476.     .dc.w    $1011        * 'and'
  477.     .dc.w    $0403        * 'mod'
  478.     .dc.w    $0f10        * 'not'
  479.     .dc.w    $0806        * 'shl'
  480.     .dc.w    $0706        * 'shr'
  481.     .dc.w    $1213        * 'xor'
  482. _cp_calS:
  483.     .dc.b    'or',0
  484.     .dc.b    'and',0
  485.     .dc.b    'mod',0
  486.     .dc.b    'not',0
  487.     .dc.b    'shl',0
  488.     .dc.b    'shr',0
  489.     .dc.b    'xor',0
  490.     .even
  491.  
  492.  
  493.  
  494.  * (a2) と a5 からの文字列を見比べる。
  495.  * 一致してかつ、後ろが英数字以外    zero
  496.  * 不一致                non zero
  497.  * a0,d0 : 破壊
  498.  * a2    : $00 の後ろ(次の文字列)
  499.     .xdef    one_check
  500. one_check:
  501.     movea.l    a5,a0
  502. @@:
  503.     move.b    (a2)+,d0
  504.     beq    oc_ok
  505.     cmp.b    (a0)+,d0
  506.     beq    @b
  507. @@:
  508.     tst.b    (a2)+        * 次へ
  509.     bne    @b
  510. oc_out:
  511.     moveq    #-1,d0
  512.     rts
  513.  
  514. oc_ok:
  515.     move.b    (a0),d0
  516.  
  517.     cmpi.b    #'$',d0
  518.     beq    oc_out
  519.     cmpi.b    #'0',d0
  520.     bcs    @f
  521.     cmpi.b    #'9',d0
  522.     bls    oc_out
  523.     cmpi.b    #'A',d0
  524.     bcs    @f
  525.     cmpi.b    #'Z',d0
  526.     bls    oc_out
  527.     cmpi.b    #'_',d0
  528.     beq    oc_out
  529.     cmpi.b    #'a',d0
  530.     bcs    @f
  531.     cmpi.b    #'z',d0
  532.     bls    oc_out
  533. @@:
  534.     movea.l    a0,a5
  535.     moveq    #0,d0
  536.     rts
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.     .xdef    int定数get
  546. int定数get:
  547.     movem.l    d1-d6/a1-a3,-(sp)
  548.     lea.l    tmp,a3
  549.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  550.  * int        d2.w    = 0000
  551.     moveq    #0,d2
  552.     bsr    math解釈    * math解釈の最適化を利用
  553.  *    return  d6.w    = 変数の型
  554.     lea.l    tmp,a3
  555.     cmpi.w    #$80_00,(a3)+
  556.     bne    式err
  557.     move.l    (a3)+,d0
  558.     movem.l    (sp)+,d1-d6/a1-a3
  559.     rts
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569. INT    equ    $0000
  570. STR    equ    $0100
  571. CHAR    equ    $0200
  572. FLOAT    equ    $8000
  573. 不明    equ    $ffff
  574.  
  575.  
  576.  
  577.  
  578.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  579.  * int        d2.w    = 0000
  580.  * str        d2.w    = 0100
  581.  * char     d2.w    = 0200
  582.  * float    d2.w    = 8000
  583.  * 型未判明    d2.w    = ffff
  584.     .xdef    math解釈
  585. math解釈:
  586.  *    return  d6.w    = 変数の型
  587.  *    今のところ一応 'math解釈' の内部では tmp は使わないことになっている
  588.  * a4 : 保存
  589.     move.l    a4,-(sp)        * 全然アドレスレジスタが足りない
  590.     lea.l    -$400(sp),sp    * 1 KB のワーク
  591.     movea.l    sp,a4
  592.     move.l    a3,$c(a4)        * 書き込み先
  593.     movea.l    a4,a0
  594.     movea.l    a4,a1
  595.     lea.l    $10(a0),a0
  596.     move.l    a0,(a1)+        * 式を並べるポインタ
  597.     lea.l    $100-$10(a0),a0
  598.     move.l    a0,(a1)+        * 項のアドレスを並べるポインタ
  599.     lea.l    $200-$100(a0),a0
  600.     move.l    a0,(a1)+        * 項を並べるポインタ
  601.  
  602.     move.l    d2,-(sp)    * 最後に型チェック
  603.  
  604.  
  605.  
  606.  
  607.  * 式を解釈して (a3) から書き込む
  608. 解釈:
  609.  
  610.  * 演算子チェック    not と - は特別に先頭に有っても良いので
  611.     bsr    cal_check
  612.  * 演算子だったら    d0.w = 演算子番号+優先順位
  613.  * 違ったら        d0.w = 0
  614.  * プログラム終了なら    d0.w = -1
  615.     tst.w    d0
  616.     bmi    式err
  617.     beq    解釈loop
  618.     cmpi.w    #$0504,d0        * '+' は 無視
  619.     beq    解釈loop
  620.     cmpi.w    #$0f10,d0        * 'not'
  621.     beq    Not
  622.     cmpi.w    #$0604,d0        * '-'
  623.     bne    式err        * 式の先頭に -,not 以外は使えません
  624.     move.w    #$1300,d0        * minus(特別)
  625.  
  626. Not:
  627.     movea.l    (a4),a0
  628.     move.w    d0,(a0)+    * 式(演算子)
  629.     move.l    a0,(a4)
  630.  
  631.  
  632.  
  633. 解釈loop:
  634.  * まず、空白(9,32)を飛ばして、先頭の文字を見る。
  635.     bsr    first_check_a5_in_line
  636.  * 数字なら            d0 = 0
  637.  * 行の終わりなら        d0 = -1
  638.  * その他なら            d0 = そのキャラクタ
  639.  
  640.     tst.w    d0
  641.     beq    数字
  642.     bmi    式err
  643.     cmpi.b    #'.',d0
  644.     beq    数字
  645.     cmpi.b    #'&',d0
  646.     beq    型付き数字
  647.     cmpi.b    #'"',d0
  648.     beq    str定数
  649.     cmpi.b    #$27,d0        * 「 ' 」
  650.     beq    一文字定数
  651.  
  652.  
  653.  
  654.  * 括弧がついてるかどうか調べなければ
  655.     cmpi.b    #'(',d0
  656.     bne    括弧無し
  657.  
  658.     addq.l    #1,a5
  659.     move.l    8(a4),a3
  660.     moveq    #-1,d2
  661.     bsr    math解釈            ****  再帰  ****
  662.  
  663.     movem.l    (a4),a0-a2
  664.         * a1 = 項のアドレスを並べるポインタ
  665.         * a2 = 項を並べるポインタ
  666.     clr.w    (a0)+            * 式
  667.     move.l    a2,(a1)+
  668.     adda.l    d0,a2        * 項
  669.     lsr.l    #1,d0
  670.     move.l    d0,(a1)+    * 長さ
  671.     movem.l    a0-a2,(a4)
  672.  
  673.     cmpi.b    #')',(a5)+        * 括弧がちゃんと終わっているか?
  674.     beq    演算子チェック
  675.     bra    式err
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684. 括弧無し:
  685.  
  686.  * ハッシュ値を計算しながら、文字数を数える
  687.     bsr    hash
  688.  * a2.l = 元の対象の開始アドレス
  689.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  690.  * d4.w = 文字数 - 1
  691.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  692.     tst.w    d4
  693.     blt    式err
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  * 関数かどうかチェック
  701.     cmpi.b    #'(',d1
  702.     bne    変数かどうかチェック
  703.  
  704.  
  705.  *        d4.l = * (hash.w)(文字数-1)
  706.  *         a2.l = 元の対象の開始アドレス
  707.     bsr    function_check
  708.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  709.  *    = $8000  float
  710.  *    = $8001  int
  711.  *    = $8003  str
  712.  *    = $ffff  void
  713.  * d0.w < 0 の時
  714.  *    d1.w = 引き数の個数
  715.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  716.  *    a2   = パラメーターテーブル
  717.     tst.w    d0
  718.     beq    変数かどうかチェック
  719.  
  720.  
  721.     tst.b    d0
  722.     bmi    void呼出
  723.     beq    float呼出
  724.     subq.b    #1,d0
  725.     beq    int呼出
  726.     subq.b    #1,d0
  727.     beq    char呼出
  728. *str呼出:
  729.     move.w    #$c001,d2
  730.     bra    @f
  731. float呼出:
  732.     move.w    #$c080,d2
  733.     bra    @f
  734. char呼出:
  735.     move.w    #$c002,d2
  736.     bra    @f
  737. int呼出:
  738.     move.w    #$c000,d2        * int 関数を示す
  739. @@:
  740.  
  741.  
  742.  * 関数の処理
  743.     movem.l    (a4),a0-a1/a3
  744.         * a1 = 項のアドレスを並べるポインタ
  745.         * a3 = 項を並べるポインタ
  746.     clr.w    (a0)+            * 式
  747.     move.l    a3,(a1)+
  748.  
  749.     move.w    d2,(a3)+        * 関数印+型
  750.  * 関数の解釈
  751.  * input    a2   = パラメーターテーブル
  752.  *        a3   = 書き込み先アドレス
  753.  *        d1.w = 引き数の個数
  754.  *        d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  755.     movem.l    d4-d6/a0-a1/a4,-(sp)
  756.     bsr    function解釈
  757.     movem.l    (sp)+,d4-d6/a0-a1/a4
  758.  *        d0   = 書き込んだ長さ
  759.  
  760.  
  761.     addq.l    #2,d0
  762.     lsr.l    #1,d0            * ワード単位
  763.     move.l    d0,(a1)+
  764.  
  765.     movem.l    a0-a1/a3,(a4)
  766.     bra    演算子チェック
  767.  
  768. void呼出:
  769.     ERRORS    21
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778. 変数かどうかチェック:
  779.  * 変数かどうかチェック
  780.  *        d4.l = * (hash.w)(文字数-1)
  781.  *         a2.l = 元の対象の開始アドレス
  782.     bsr    variable_check
  783.  * 重なってない        d2.l    = -1
  784.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  785.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  786.  * char の n 番と一致    d2.l    = n+0200
  787.  * float の n 番と一致    d2.l    = n+8000
  788.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  789.  * d0 =   0 : 普通の変数
  790.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  791.  *    $80 : auto 変数
  792.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  793.  *     -1 : 当たりなし
  794.     bmi    misengen_var
  795.  
  796.     cmpi.w    #$0100,d2
  797.     bne    @f
  798.     cmpi.b    #'[',(a5)
  799.     beq    文字列ポインタ
  800. @@:
  801.  
  802.  
  803.  
  804.     btst    #0,d0
  805.     beq    普通の変数参照
  806.  
  807.  * 配列の場合
  808.     move.l    (a4),a1
  809.     clr.w    (a1)+            * 式
  810.     move.l    a1,(a4)
  811.     movem.l    4(a4),a1-a2
  812.         * a1 = 項のアドレスを並べるポインタ
  813.         * a2 = 項を並べるポインタ
  814.     move.l    a2,(a1)+
  815.  
  816. * a0 = その配列情報
  817.     addq.l    #8,a0
  818.     move.w    (a0)+,d2    * 型    ($0000,$0100,$0200,$8000)
  819.  
  820.     move.b    #$60,d2        * 配列を示す
  821.     tst.b    d0
  822.     bpl    @f
  823.     addq.b    #1,d2
  824. @@:
  825.     ror.w    #8,d2
  826.     swap    d2
  827.     move.l    d2,(a2)+    * [配列の印 + 型] + 配列番号
  828. *    move.w    d1,(a2)+    * 
  829.  
  830.     move.w    (a0)+,d2    * 次元 - 1
  831.  
  832.  
  833.     cmpi.b    #'(',(a5)
  834.     bne    式err
  835.  
  836.     moveq    #0,d0        * 添え字情報の長さ
  837. @@:
  838.     addq.l    #1,a5
  839.  
  840.     movea.l    a2,a3
  841.     movem.l    d0/d2/d6/a0-a1,-(sp)
  842.     moveq    #0,d2        * int
  843.     bsr    math解釈            ****  再帰  ****
  844.     add.l    (sp)+,d0
  845.     movem.l    (sp)+,d2/d6/a0-a1
  846.     movea.l    a3,a2            * 項
  847.  
  848.     cmpi.b    #',',(a5)
  849.     dbne    d2,@b
  850.     beq    添え字の個数が多い
  851.     tst.w    d2
  852.     bne    添え字の個数が少ない
  853.  
  854.     cmpi.b    #')',(a5)+        * 括弧がちゃんと終わっているか?
  855.     bne    式err
  856.  
  857.  
  858.     lsr.l    #1,d0
  859.     addq.l    #4/2,d0
  860.     move.l    d0,(a1)+    * 長さ
  861.  
  862.  
  863.     movem.l    a1-a2,4(a4)
  864.     bra    演算子チェック
  865.  
  866. 添え字の個数が少ない:
  867.     ERROR    56
  868. 添え字の個数が多い:
  869.     ERROR    57
  870.  
  871.  
  872.  
  873.  
  874. 普通の変数参照:
  875.     movem.l    (a4),a0-a2
  876.     clr.w    (a0)+            * 式
  877.         * a1 = 項のアドレスを並べるポインタ
  878.         * a2 = 項を並べるポインタ
  879.     move.l    a2,(a1)+
  880.  
  881.     move.b    #$40,d2        * 変数を示す
  882.     tst.b    d0
  883.     bpl    @f
  884.     addq.b    #1,d2
  885. @@:
  886.     ror.w    #8,d2
  887.     swap    d2
  888.     move.l    d2,(a2)+
  889.     moveq    #4/2,d0
  890.     move.l    d0,(a1)+
  891.     movem.l    a0-a2,(a4)
  892.     bra    演算子チェック
  893.  
  894.  
  895.  
  896.  
  897.  
  898. 文字列ポインタ:
  899.     addq.l    #1,a5
  900.  
  901.     btst    #0,d0
  902.     bne    式err        * 配列だって?
  903.     tst.l    d2
  904.     bmi    式err        * system変数?
  905.  
  906.     move.w    #$0200,d2    * char
  907.  * 型(d6) <- 型(d2) の代入が整合しているかどうか
  908. *    bsr    型check
  909.  
  910.     move.w    #$5002,d2
  911.     tst.b    d0
  912.     bge    @f
  913.     move.w    #$5102,d2
  914. @@:
  915.  
  916.     movem.l    (a4),a0-a2
  917.         * a1 = 項のアドレスを並べるポインタ
  918.         * a2 = 項を並べるポインタ
  919.     clr.w    (a0)+            * 式
  920.     move.l    a2,(a1)+
  921.  
  922.     move.w    d2,(a2)+    * 文字列変数ポインタ
  923.     swap    d2
  924.     move.w    d2,-(sp)
  925.  
  926.     movea.l    a2,a3
  927.     movem.l    a0-a1,-(sp)
  928.     moveq    #0,d2        * int
  929.     bsr    math解釈            ****  再帰  ****
  930.     movem.l    (sp)+,a0-a1
  931.     movea.l    a3,a2
  932.  
  933.     move.w    (sp)+,(a2)+    * 変数番号
  934.  
  935.     cmpi.b    #']',(a5)+        * 括弧がちゃんと終わっているか?
  936.     bne    式err
  937.  
  938.     lsr.l    #1,d0
  939.     addq.l    #4/2,d0
  940.     move.l    d0,(a1)+    * 長さ
  941.  
  942.     movem.l    a0-a2,(a4)
  943.     bra    演算子チェック
  944.  
  945.  
  946.  
  947.  
  948.  
  949.  
  950.  
  951.  
  952. str定数:
  953.     movem.l    (a4),a0-a2
  954.         * a1 = 項のアドレスを並べるポインタ
  955.         * a2 = 項を並べるポインタ
  956.     clr.w    (a0)+    * 式
  957.  
  958.     move.l    a2,(a1)+
  959.     move.w    #$8001,(a2)+    * 文字列定数を示す
  960.  
  961.  * (a5)"~" を (a2) に書き移す
  962.     bsr    str_copy
  963.  * a2 = 次の偶数アドレス
  964.  * d0 = データの長さ / 2
  965.  
  966.     addq.l    #1,d0
  967.     move.l    d0,(a1)+    * 項の長さ
  968.  
  969.     movem.l    a0-a2,(a4)
  970.  
  971.     bra    演算子チェック
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979. 一文字定数:
  980.     addq.l    #1,a5
  981.     moveq.l    #0,d0
  982.     move.b    (a5)+,d0
  983.     cmpi.b    #$27,(a5)+    * 「 ' 」
  984.     bne    式err
  985.  
  986.     moveq    #INT,d2
  987.     movem.l    (a4),a0-a2
  988.         * a1 = 項のアドレスを並べるポインタ
  989.         * a2 = 項を並べるポインタ
  990.     clr.w    (a0)+    * 式
  991.  
  992.     move.l    a2,(a1)+
  993.     moveq    #6/2,d1
  994.     move.l    d1,(a1)+    * 項の長さ
  995.  
  996.     move.w    #$8000,(a2)+        * 定数を示す
  997.     move.l    d0,(a2)+    * int
  998.  
  999.     movem.l    a0-a2,(a4)
  1000.  
  1001.     bra    演算子チェック
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014. 型付き数字:
  1015.     moveq    #INT,d2
  1016.     bra    @f
  1017.  
  1018. 数字:
  1019.     bsr    Imm判断     * d2 = 小数点があれば float 型、でなければ int 型
  1020. @@:
  1021.     bsr    定数get
  1022.  
  1023.     movem.l    (a4),a0-a2
  1024.         * a1 = 項のアドレスを並べるポインタ
  1025.         * a2 = 項を並べるポインタ
  1026.     clr.w    (a0)+    * 式
  1027.  
  1028.     move.l    a2,(a1)+
  1029.  
  1030.     move.w    d2,d3
  1031.     move.b    #$80,d3        * 定数を示す
  1032.     ror.w    #8,d3
  1033.     move.w    d3,(a2)+
  1034.  
  1035.     cmpi.w    #FLOAT,d2
  1036.     beq    __float
  1037.  
  1038. *    FPACK    __DTOL        * (符号)(絶対値の整数化)を取るやつ
  1039.     move.l    d0,(a2)+    * int
  1040.     moveq    #6/2,d0
  1041.     bra    @f
  1042.  
  1043. __float
  1044.     move.l    d0,(a2)+    * float の上位ロングワード
  1045.     move.l    d1,(a2)+    * float の下位ロングワード
  1046.     moveq    #10/2,d0
  1047.     cmpi.b    #'#',(a5)
  1048.     bne    @f
  1049.     addq.l    #1,a5
  1050. @@:
  1051.     move.l    d0,(a1)+    * 項の長さ
  1052.  
  1053.     movem.l    a0-a2,(a4)
  1054.  
  1055. ***    bra    演算子チェック    *
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.  
  1066. 演算子チェック:
  1067.  
  1068.  * 演算子チェック
  1069.     bsr    cal_check
  1070.  * 演算子だったら    d0.w = 演算子番号+優先順位
  1071.  * 違ったら        d0.w = 0
  1072.  * プログラム終了なら    d0.w = -1
  1073.     tst.w    d0
  1074.     ble    並べ替え        * 数式コード化終了
  1075.     cmpi.w    #$0f10,d0        * 'not'
  1076.     beq    式err
  1077.  
  1078.     movea.l    (a4),a0
  1079.     move.w    d0,(a0)+    * siki
  1080.     move.l    a0,(a4)
  1081.     bra    解釈
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092. **    **    **
  1093.  
  1094.  
  1095. 並べ替え:
  1096.     movea.l    (a4),a1
  1097.     move.l    a1,d4
  1098.     sub.l    a4,d4
  1099.     lsr.w    #1,d4
  1100.     subi.w    #9,d4
  1101.     move.w    d4,-(sp)    * 保存 (式要素数-1)
  1102.     subq.w    #1,d4
  1103.     bcs    展開
  1104.  
  1105. 並べ替えloop:
  1106.     move.w    -(a1),d2
  1107.     ble    並べ替えcont
  1108.     cmpi.w    #$0f10,d2        * 'not'
  1109.     beq    並べ替えcont
  1110.     cmpi.w    #$1300,d2        * minus
  1111.     beq    並べ替えcont
  1112.  
  1113.     movea.l    a1,a0
  1114.     move.w    d4,d3
  1115. 移動loop:
  1116.     move.w    -(a0),d1
  1117.     beq    @f        * 項は無条件でずれる
  1118.     bmi    移動終了    * 移動後のものは抜かさない
  1119.     cmp.b    d2,d1        * 優先順位比較
  1120.     bhi    移動終了
  1121. @@:
  1122.     move.w    d1,2(a0)
  1123.  
  1124.     dbra    d3,移動loop
  1125.     subq.l    #2,a0
  1126. 移動終了:
  1127.     bset    #15,d2        * もう動かない
  1128.     move.w    d2,2(a0)
  1129. 並べ替えcont:
  1130.     dbra    d4,並べ替えloop
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138. 展開:
  1139.     move.w    (sp)+,d5
  1140.     lea.l    $100(a4),a1
  1141.     lea.l    $10(a4),a2
  1142.     move.l    $c(a4),a3
  1143.  
  1144.     bsr    最適化                *
  1145.     lsl.w    #8,d0
  1146.     move.l    (sp)+,d6
  1147.     cmpi.w    #$ffff,d6
  1148.     bne    @f
  1149.     move.w    d0,d6
  1150.     bra    1f
  1151. @@:
  1152.     cmp.w    d0,d6
  1153.     beq    1f
  1154.     cmpi.w    #STR,d0
  1155.     beq    型違い
  1156.     cmpi.w    #STR,d6
  1157.     beq    型違い
  1158. 1:
  1159.  
  1160.     moveq    #0,d0
  1161. 展開loop:
  1162.     move.w    (a2)+,d1
  1163.     cmpi.w    #$100,d1
  1164.     bcc    演算子だ
  1165.  
  1166.     lsl.w    #3,d1
  1167.     movea.l    (a1,d1.w),a0        * その項の内容のアドレス
  1168.     move.l    4(a1,d1.w),d1        * その項の長さ (単位・ワード)
  1169.     add.w    d1,d0
  1170.     subq.w    #1,d1
  1171. @@:
  1172.     move.w    (a0)+,(a3)+
  1173.     dbra    d1,@b
  1174.     bra    展開cont
  1175.  
  1176.  
  1177. 演算子だ:
  1178.     clr.w    d2
  1179.     move.b    d1,d2
  1180.     move.w    d2,(a3)+    * 演算子だ+型
  1181.     lsr.w    #8,d1
  1182.     add.w    d1,d1
  1183.     move.w    d1,(a3)+    * 演算子番号 * 2
  1184.     addq.w    #2,d0        * 長さ (単位・ワード)
  1185. 展開cont:
  1186.     dbra    d5,展開loop
  1187.     add.w    d0,d0        * 長さ (単位・バイト)
  1188.     lea.l    $400(sp),sp
  1189.     move.l    (sp)+,a4
  1190.     rts
  1191.  
  1192.  
  1193. misengen_var:
  1194.     ERRORS    7
  1195. 式err:
  1196.     ERROR    9
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208. 最適化:
  1209.     movem.l    d2/d4/a1-a3,-(sp)
  1210.     moveq    #0,d0
  1211.     move.w    d5,d4        * 項の数
  1212. sai1:
  1213.     tst.w    (a2)+
  1214.     bne    @f
  1215.     move.w    d0,-2(a2)        * 「値」に番号づけ
  1216.     addq.w    #1,d0
  1217. @@:
  1218.     dbra    d4,sai1
  1219.  
  1220.  
  1221.     .xdef    break5
  1222. break5:
  1223.  
  1224.     move.w    d5,d4        * 項の数
  1225. 最適化loop:
  1226.     move.w    -(a2),d6    * 後ろから読んでいく(演算子「後づけ」状態)
  1227.     cmpi.w    #$100,d6
  1228.     bcc    最適化_演算子
  1229.  
  1230. 最適化_値:
  1231.     move.w    d6,d1
  1232.     lsl.w    #3,d1
  1233.     movea.l    (a1,d1.w),a0        * その項の内容のアドレス
  1234.  
  1235.     cmpi.b    #$80,(a0)+
  1236.     beq    1f
  1237.     moveq    #-1,d6        * 定数でない
  1238.     bra    @f
  1239. 1:
  1240.     lsl.w    #8,d6
  1241. @@:
  1242.     move.b    (a0),d6
  1243.     move.w    d6,-(sp)    * スタックに積む    (値番号(<0:定数でない)、型)
  1244.     bra    最適化cont
  1245.  
  1246.  
  1247.  
  1248.  
  1249. 最適化_演算子:
  1250.     bclr    #15,d6        * 移動済み印がついてるかも
  1251.     move.w    d6,d2
  1252.     lsr.w    #8,d2    * 演算子番号
  1253.     cmpi.w    #$0f,d2        * not
  1254.     beq    一項演算子
  1255.     cmpi.w    #$13,d2        * minus
  1256.     beq    一項演算子
  1257. 二項演算子:
  1258.     move.w    (sp)+,d0    * 前
  1259.     move.w    (sp),d1        * 後
  1260.     cmpi.b    #1,d0        * STR
  1261.     bne    @f
  1262.     cmpi.b    #1,d1        * STR
  1263.     beq    二項STR
  1264.     bra    型違い
  1265. @@:
  1266.  
  1267.     move.b    d0,d3
  1268.     cmp.b    d1,d0
  1269.     beq    1f        * 型一致
  1270.     cmpi.b    #1,d1        * STR
  1271.     beq    型違い
  1272.     tst.b    d0    * float
  1273.     bmi    1f
  1274.     tst.b    d1    * float
  1275.     bmi    2f
  1276.     clr.b    d0
  1277.     clr.b    d3
  1278.     bra    1f
  1279. 2:
  1280.     move.b    d1,d3
  1281. 1:
  1282.     move.b    d3,d6        * 型
  1283.     move.b    d3,1(sp)
  1284.  
  1285.     cmpi.w    #3,d2        * \
  1286.     beq    3f
  1287.     cmpi.w    #4,d2        * mod
  1288.     beq    3f
  1289.     cmpi.w    #7,d2
  1290.     bcs    @f
  1291. 3:
  1292.     clr.b    d6        * int型専用の演算子
  1293.     move.w    #$ff00,(sp)    * (定数でない、int 型)
  1294. *    clr.w    1(sp)
  1295. @@:
  1296.     move.w    d6,(a2)        * 型登録
  1297. *    bra    最適化cont
  1298.  
  1299.     tst.w    d1
  1300.     bmi    @f
  1301.     tst.w    d0
  1302.     bmi    後ろは定数である
  1303.  
  1304.  * 両方とも定数
  1305.     tst.b    d0
  1306.     bmi    二項定数float
  1307.     tst.b    d1
  1308.     bmi    二項定数float
  1309.     bra    二項定数int
  1310.  
  1311. @@:
  1312.     tst.w    d0
  1313.     bmi    両方は定数でない
  1314. 前は定数である:
  1315.     tst.b    d0
  1316.     bmi    両方は定数でない
  1317.     tst.b    d1
  1318.     bmi    両方は定数でない
  1319.  * とりあえず両方 int の時のみ
  1320.     move.w    d0,d1
  1321.     cmpi.w    #1,d2        * *
  1322.     beq    掛け算片方
  1323.     cmpi.w    #5,d2        * +
  1324.     beq    足し算片方
  1325.     bra    両方は定数でない
  1326.  
  1327.  
  1328. 後ろは定数である:
  1329.     tst.b    d0
  1330.     bmi    両方は定数でない
  1331.     tst.b    d1
  1332.     bmi    両方は定数でない
  1333.  * とりあえず両方 int の時のみ
  1334.  
  1335.     subq.w    #8,d2
  1336.     bhi    両方は定数でない
  1337.     add.w    d2,d2
  1338.     move.w    _s(pc,d2.w),d2
  1339.     jmp    _s(pc,d2.w)
  1340.     .dc.w    両方は定数でない-_s
  1341.     .dc.w    掛け算片方-_s
  1342.     .dc.w    割り算片方-_s
  1343.     .dc.w    割り算片方-_s
  1344.     .dc.w    両方は定数でない-_s
  1345.     .dc.w    足し算片方-_s
  1346.     .dc.w    引き算片方-_s
  1347.     .dc.w    SHR片方-_s
  1348. _s:    .dc.w    SHL片方-_s
  1349. SHL片方:
  1350.     lsr.w    #8,d1
  1351.     move.w    d1,d0        * #
  1352.     lsl.w    #3,d0
  1353.     movea.l    (a1,d0.w),a0
  1354.     move.l    2(a0),d0        * 第二項
  1355.     beq    両方は定数でない
  1356.     subq.l    #8,d0
  1357.     bhi    両方は定数でない
  1358.  
  1359.     add.w    d0,d0
  1360.     move.w    _shl(pc,d0.w),d0
  1361.     bra    9f
  1362.     .dc.w    $30    *2
  1363.     .dc.w    $32    *4
  1364.     .dc.w    $36    *8
  1365.     .dc.w    $3e    *16
  1366.     .dc.w    $40    *32
  1367.     .dc.w    $41
  1368.     .dc.w    $42
  1369. _shl:    .dc.w    $43
  1370.  
  1371.  
  1372. SHR片方:
  1373.     lsr.w    #8,d1
  1374.     move.w    d1,d0        * #
  1375.     lsl.w    #3,d0
  1376.     movea.l    (a1,d0.w),a0
  1377.     move.l    2(a0),d0        * 第二項
  1378.     beq    両方は定数でない
  1379.     subq.l    #8,d0
  1380.     bhi    両方は定数でない
  1381.  
  1382.     add.w    #$50-1+8,d0        * $50~$57
  1383.     bra    9f
  1384.  
  1385.  
  1386. 引き算片方:
  1387.     lsr.w    #8,d1
  1388.     move.w    d1,d0        * #
  1389.     lsl.w    #3,d0
  1390.     movea.l    (a1,d0.w),a0
  1391.     move.l    2(a0),d0        * 第二項
  1392.     beq    両方は定数でない    * あとで
  1393.     subq.l    #8,d0
  1394.     bhi    両方は定数でない
  1395.  
  1396.     add.w    #$28-1+8,d0        * $28~$2f
  1397.     bra    9f
  1398.  
  1399.  
  1400. 割り算片方:
  1401.     lsr.w    #8,d1
  1402.     move.w    d1,d0        * #
  1403.     lsl.w    #3,d0
  1404.     movea.l    (a1,d0.w),a0
  1405.     move.l    2(a0),d0        * 第二項
  1406.     lsr.l    #1,d0            * H8/2/1 thanks for 村重さん
  1407.     bcs    両方は定数でない
  1408.     beq    式err            * 0で割れんよ
  1409.  
  1410.     moveq    #$48,d2
  1411.     .rept    7
  1412.     lsr.w    #1,d0
  1413.     bcs    @f
  1414.     addq.w    #1,d2
  1415.     .endm
  1416.     lsr.w    #1,d0
  1417.     bcc    両方は定数でない
  1418. @@:
  1419.     tst.l    d0
  1420.     bne    両方は定数でない
  1421.     move.w    d2,d0
  1422.     bra    9f
  1423.  
  1424.  
  1425.  
  1426.  
  1427. 掛け算片方:
  1428.     lsr.w    #8,d1
  1429.     move.w    d1,d0        * #
  1430.     lsl.w    #3,d0
  1431.     movea.l    (a1,d0.w),a0
  1432.     move.l    2(a0),d0        * 第二項
  1433.     subq.l    #2,d0
  1434.     bcs    両方は定数でない    * 0,1 は無視
  1435.     cmpi.l    #16-2,d0
  1436.     bhi    @f
  1437.     add.w    #$30,d0            * $30~$3e
  1438.     bra    9f
  1439.  
  1440.  
  1441. @@:
  1442.     cmpi.l    #32-2,d0
  1443.     beq    mul32
  1444.     cmpi.l    #64-2,d0
  1445.     beq    mul64
  1446.     cmpi.l    #128-2,d0
  1447.     beq    mul128
  1448.     cmpi.l    #256-2,d0
  1449.     beq    mul256
  1450.     bra    両方は定数でない
  1451. mul32:
  1452.     move.w    #$40,d0
  1453.     bra    9f
  1454. mul64:
  1455.     move.w    #$41,d0
  1456.     bra    9f
  1457. mul128:
  1458.     move.w    #$42,d0
  1459.     bra    9f
  1460. mul256:
  1461.     move.w    #$43,d0
  1462.     bra    9f
  1463.  
  1464. 足し算片方:
  1465.     lsr.w    #8,d1
  1466.     move.w    d1,d0        * #
  1467.     lsl.w    #3,d0
  1468.     movea.l    (a1,d0.w),a0
  1469.     move.l    2(a0),d0        * 第二項
  1470.     beq    両方は定数でない    * あとで
  1471.     subq.l    #8,d0
  1472.     bhi    両方は定数でない
  1473.  
  1474.     add.w    #$1f+8,d0        * $20~$27
  1475. 9:
  1476.     lsl.w    #8,d0
  1477.     move.w    d0,(a2)        * 'addq.l d0,??' の演算子(int)
  1478.     move.w    #$ff00,(sp)    * (定数でない、int 型)
  1479.  
  1480.     subq.w    #1,d5
  1481.     move.w    d5,d0
  1482.     sub.w    d4,d0
  1483.     movea.l    a2,a0
  1484. @@:
  1485.     cmp.w    (a0)+,d1
  1486.     dbeq    d0,@b
  1487.     bne    最適化cont
  1488.     subq.l    #2,a0
  1489. @@:
  1490.     move.w    2(a0),(a0)+
  1491.     dbra    d0,@b
  1492.     bra    最適化cont
  1493.  
  1494.  
  1495.  
  1496.  
  1497.  
  1498. 二項定数float演算しない:
  1499.     move.w    #$ff80,(sp)    * (定数でない、float 型)
  1500.     bra    最適化cont
  1501. 二項定数float:
  1502.     cmpi.w    #3,d2        * \
  1503.     beq    二項定数float演算しない
  1504.     cmpi.w    #4,d2        * mod
  1505.     beq    二項定数float演算しない
  1506.     cmpi.w    #7,d2        * sh? 関係・論理
  1507.     bcc    二項定数float演算しない
  1508.     tst.b    d0
  1509.     bge    @f
  1510.     move.w    d0,(sp)        * float登録
  1511.         * (d0 がfloat でないなら、すでに登録されているd1がfloat)
  1512. @@:
  1513.  
  1514.     movem.w    d0/d2,-(sp)
  1515.  
  1516.     lsr.w    #8,d1
  1517.     bcc    第二項int
  1518.     lsl.w    #3,d1
  1519.     movea.l    (a1,d1.w),a0
  1520.     movem.l    2(a0),d2-d3        * 第二項
  1521.     bra    @f
  1522. 第二項int:
  1523.     lsl.w    #3,d1
  1524.     movea.l    (a1,d1.w),a0
  1525.     move.l    2(a0),d0        * 第二項
  1526.     FPACK    __LTOD
  1527.     move.l    d0,d2
  1528.     move.l    d1,d3
  1529. @@:
  1530.     move.w    (sp)+,d0
  1531.  
  1532.     lsr.w    #8,d0
  1533.     bcc    第一項int
  1534.     lsl.w    #3,d0
  1535.     movea.l    (a1,d0.w),a0
  1536.     movem.l    2(a0),d0-d1        * 第一項
  1537.     bra    @f
  1538. 第一項int:
  1539.     lsl.w    #3,d0
  1540.     movea.l    (a1,d0.w),a0
  1541.     move.l    2(a0),d0        * 第一項
  1542.     FPACK    __LTOD
  1543. @@:
  1544.  
  1545.     move.w    (sp)+,d6
  1546.     add.w    d6,d6        * 演算子番号
  1547.     move.w    saf(pc,d6.w),d6
  1548.     jmp    saf(pc,d6.w)
  1549. saf:
  1550.     .dc.w    0    * dummy
  1551.     .dc.w    Sfmul-saf
  1552.     .dc.w    Sfdiv-saf
  1553.     .dc.w    0
  1554.     .dc.w    0
  1555.     .dc.w    Sfadd-saf
  1556.     .dc.w    Sfsub-saf
  1557. Sfmul:
  1558.     FPACK    __DMUL
  1559.     bra    @f
  1560. Sfdiv:
  1561.     FPACK    __DDIV
  1562.     bra    @f
  1563. Sfadd:
  1564.     FPACK    __DADD
  1565.     bra    @f
  1566. Sfsub:
  1567.     FPACK    __DSUB
  1568. @@:
  1569.     move.w    (sp),d2
  1570.     lsr.w    #8,d2
  1571.     move.w    d2,4(a2)        * だんだんよくわからなくなってきた。
  1572.     lsl.w    #3,d2
  1573.     movea.l    (a1,d2.w),a0
  1574.     movem.l    d0-d1,2(a0)
  1575.     bra    2ずらしf
  1576.  
  1577.  
  1578.  
  1579.  * 両方ともint定数
  1580. 二項定数int:
  1581.     lsr.w    #8,d0
  1582.     lsl.w    #3,d0
  1583.     movea.l    (a1,d0.w),a0
  1584.     addq.l    #2,a0
  1585.     move.l    (a0),d0        * 第一項
  1586.  
  1587.     lsr.w    #8,d1
  1588.     lsl.w    #3,d1
  1589.     movea.l    (a1,d1.w),a0
  1590.     addq.l    #2,a0
  1591.     move.l    (a0),d1        * 第二項
  1592.  
  1593.     add.w    d2,d2        * 演算子番号
  1594.     move.w    sai(pc,d2.w),d2
  1595.     jmp    sai(pc,d2.w)
  1596. sai:
  1597.     .dc.w    0    * dummy
  1598.     .dc.w    Smul-sai
  1599.     .dc.w    Sdiv-sai
  1600.     .dc.w    Sdiv2-sai
  1601.     .dc.w    Smod-sai
  1602.     .dc.w    Sadd-sai
  1603.     .dc.w    Ssub-sai
  1604.     .dc.w    Sshr-sai
  1605.     .dc.w    Sshl-sai
  1606.     .dc.w    Sequal-sai
  1607.     .dc.w    Snoteq-sai
  1608.     .dc.w    Ssmall-sai
  1609.     .dc.w    Slarge-sai
  1610.     .dc.w    Seq_small-sai
  1611.     .dc.w    Seq_large-sai
  1612.     .dc.w    0    * Snot-sai
  1613.     .dc.w    Sand-sai
  1614.     .dc.w    Sor-sai
  1615.     .dc.w    Sxor-sai
  1616. *    .dc.w    Sminus-sai
  1617.  
  1618.  
  1619.  
  1620. Smul:
  1621.     FPACK    __LMUL
  1622.     bra    2ずらし
  1623. Sdiv:
  1624. Sdiv2:
  1625.     FPACK    __LDIV
  1626.     bra    2ずらし
  1627. Smod:
  1628.     FPACK    __LMOD
  1629.     bra    2ずらし
  1630. Sadd:
  1631.     add.l    d1,d0
  1632.     bra    2ずらし
  1633. Ssub:
  1634.     sub.l    d1,d0
  1635.     bra    2ずらし
  1636. Sshr:
  1637.     lsr.l    d1,d0
  1638.     bra    2ずらし
  1639. Sshl:
  1640.     lsl.l    d1,d0
  1641.     bra    2ずらし
  1642. Sequal:
  1643.     cmp.l    d1,d0
  1644.     beq    Strue
  1645.     bra    Sfault
  1646. Snoteq:
  1647.     cmp.l    d1,d0
  1648.     bne    Strue
  1649.     bra    Sfault
  1650. Ssmall:
  1651.     cmp.l    d1,d0
  1652.     blt    Strue
  1653.     bra    Sfault
  1654. Slarge:
  1655.     cmp.l    d1,d0
  1656.     bgt    Strue
  1657.     bra    Sfault
  1658. Seq_small:
  1659.     cmp.l    d1,d0
  1660.     ble    Strue
  1661.     bra    Sfault
  1662. Seq_large:
  1663.     cmp.l    d1,d0
  1664.     bge    Strue
  1665.     bra    Sfault
  1666. Sfault:
  1667.     moveq    #0,d0
  1668.     bra    2ずらし
  1669. Strue:
  1670.     moveq    #-1,d0
  1671.     bra    2ずらし
  1672.  
  1673. Sand:
  1674.     and.l    d1,d0
  1675.     bra    2ずらし
  1676. Sor:
  1677.     or.l    d1,d0
  1678.     bra    2ずらし
  1679. Sxor:
  1680.     eor.l    d1,d0
  1681. *    bra    2ずらし
  1682.  
  1683. 2ずらし:
  1684.     move.l    d0,(a0)        * 後ろの項に化ける
  1685. 2ずらしf:
  1686.     subq.w    #2,d5
  1687.     move.w    d5,d0
  1688.     sub.w    d4,d0
  1689.     movea.l    a2,a0
  1690. @@:
  1691.     move.w    4(a0),(a0)+
  1692.     dbra    d0,@b
  1693.     bra    最適化cont
  1694.  
  1695.  
  1696. 両方は定数でない:
  1697.     move.b    #$ff,(sp)    * 定数でない
  1698.     bra    最適化cont
  1699.  
  1700.  
  1701.  
  1702.  
  1703.  
  1704. 二項STR:
  1705.     move.b    d0,d6        * 型
  1706.     cmpi.w    #5,d2    * '+' 
  1707.     bne    二項STR2
  1708.     move.w    d6,(a2)        * 登録
  1709.     bra    最適化cont
  1710. 二項STR2:
  1711.     cmpi.w    #9,d2
  1712.     bcs    型違い
  1713.     cmpi.w    #$0f,d2
  1714.     bcc    型違い
  1715.     clr.b    d6        * int型
  1716.     move.w    d6,(a2)        * 登録
  1717.     move.w    #$ff00,(sp)    * (定数でない、int 型)
  1718.     bra    最適化cont
  1719.  
  1720.  
  1721.  
  1722.  
  1723. 一項演算子:
  1724.     move.w    (sp),d0        * スタックから取り出す
  1725.     cmpi.b    #1,d0        * STR
  1726.     beq    型違い
  1727.     tst.b    d0
  1728.     bmi    @f    * float
  1729.     tst.w    d0
  1730.     bge    一項定数
  1731. @@:
  1732.     cmpi.w    #$0f,d2        * not
  1733.     beq    一項not
  1734. 一項minus:
  1735.     move.b    d0,d6        * 型
  1736.     move.w    d6,(a2)        * 登録
  1737.     bra    最適化cont
  1738. 一項not:
  1739.     clr.b    d6        * int 型
  1740.     move.w    d6,(a2)        * 登録
  1741.     bra    最適化cont
  1742.  
  1743. 一項定数:
  1744.     lsr.w    #8,d0        * 値番号
  1745.     lsl.w    #3,d0
  1746.     movea.l    (a1,d0.w),a0        * その項の内容のアドレス
  1747.     addq.l    #2,a0
  1748.     move.l    (a0),d0
  1749.     cmpi.w    #$0f,d2        * not
  1750.     bne    @f
  1751.     not.l    d0
  1752.     bra    1ずらし
  1753. @@:
  1754.     neg.l    d0
  1755.  
  1756. 1ずらし:
  1757.     move.l    d0,(a0)        * 後ろの項に化ける
  1758.     subq.w    #1,d5
  1759.     move.w    d5,d0
  1760.     sub.w    d4,d0
  1761.     movea.l    a2,a0
  1762. @@:
  1763.     move.w    2(a0),(a0)+
  1764.     dbra    d0,@b
  1765. *    bra    最適化cont
  1766.  
  1767.  
  1768. 最適化cont:
  1769.     dbra    d4,最適化loop
  1770.     move.w    (sp)+,d0    * スタックから出す
  1771. *最適化しない:
  1772.     movem.l    (sp)+,d2/d4/a1-a3
  1773.     rts
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784. 定数get:
  1785.     cmpi.w    #FLOAT,d2
  1786.     beq    定数float
  1787.     cmpi.b    #'&',(a5)
  1788.     beq    定数etc
  1789.     movea.l    a5,a0
  1790.     FPACK    __STOL
  1791.     movea.l    a0,a5
  1792.     rts
  1793.  
  1794. 定数etc:
  1795.     lea.l    1(a5),a0
  1796.     moveq    #$20,d0
  1797.     or.b    (a0)+,d0
  1798.     cmpi.b    #'h',d0
  1799.     beq    定数HEX
  1800.     cmpi.b    #'b',d0
  1801.     beq    定数BIN
  1802.     cmpi.b    #'o',d0
  1803.     beq    定数OCT
  1804.     bra    式err
  1805.  
  1806. 定数BIN:
  1807.     FPACK    __STOB
  1808.     movea.l    a0,a5
  1809.     rts
  1810.  
  1811. 定数OCT:
  1812.     FPACK    __STOO
  1813.     movea.l    a0,a5
  1814.     rts
  1815.  
  1816. 定数HEX:
  1817.     FPACK    __STOH
  1818.     movea.l    a0,a5
  1819.     rts
  1820.  
  1821. 定数float:
  1822.     move.w    d2,-(sp)
  1823.     movea.l    a5,a0
  1824.     FPACK    __VAL        * 数値変換
  1825.     movea.l    a0,a5
  1826.     move.w    (sp)+,d2
  1827.     rts
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836. Imm判断:    * (a5) 小数点 or '#' があれば float 型、でなければ int 型
  1837.     movea.l    a5,a0
  1838. im_loop:
  1839.     move.b    (a0)+,d2
  1840.     beq    int判定
  1841.     cmpi.b    #'.',d2
  1842.     beq    float判定
  1843.     cmpi.b    #'#',d2
  1844.     beq    float判定
  1845.     cmpi.b    #'9',d2
  1846.     bhi    int判定
  1847.     cmpi.b    #'0',d2
  1848.     bcc    im_loop
  1849. int判定:
  1850.     moveq    #INT,d2
  1851.     rts
  1852. float判定:
  1853.     move.w    #FLOAT,d2
  1854.     rts
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865.  * (a5)"~" を (a2) に書き移す
  1866. str_copy:
  1867.  * a2 = 次の偶数アドレス
  1868.  * d0 = データの長さ / 2
  1869.  
  1870.     addq.l    #1,a5        * '"'
  1871.     moveq    #0+1,d0        * 最後の $00 の文
  1872. sc_loop:
  1873.     move.b    (a5)+,d1
  1874.     beq    sc_end
  1875.     cmpi.b    #'"',d1
  1876.     bhi    sc_ok
  1877.     beq    sc_end0
  1878.     cmpi.b    #$d,d1
  1879.     beq    sc_end
  1880.     cmpi.b    #$a,d1
  1881.     beq    sc_end
  1882.  
  1883. sc_ok:
  1884.     move.b    d1,(a2)+
  1885.     addq.w    #1,d0
  1886.     bra    sc_loop
  1887.  
  1888. sc_end:
  1889.     subq.l    #1,a5        * $00,$0a,$0d
  1890. sc_end0:
  1891.     clr.b    (a2)+
  1892.  
  1893.     lsr.w    #1,d0
  1894.     bcc    @f
  1895.     addq.w    #1,d0
  1896.     clr.b    (a2)+    * even
  1897. @@:
  1898.     rts
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907. **    **    **    **    **    **    **    **    **
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  * 関数の解釈
  1917.  * input    a2   = パラメーターテーブル
  1918.  *        a3   = 書き込み先アドレス
  1919.  *        d1.w = 引き数の個数
  1920.  *        d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  1921.     .xdef    function解釈
  1922. function解釈:
  1923.  *        d0   = 書き込んだ長さ
  1924.  
  1925.  
  1926.     movem.l    d4-d6,-(sp)
  1927.  
  1928. *    move.w    d3,(a3)+    * d3.w = 0 から始まる関数番号
  1929.     move.w    d3,-(sp)    * d3.w = 0 から始まる関数番号
  1930.     move.w    d1,(a3)+    * d1.w = 引き数の個数
  1931.     moveq    #4,d1    * 書き込んだ長さ
  1932.  
  1933.  
  1934. fnc_loop:
  1935.     cmpi.b    #')',(a5)
  1936.     beq    @f
  1937.     addq.l    #1,a5        * '(' or ','
  1938. @@:
  1939.  
  1940.  * まず、空白(9,32)を飛ばして、先頭の文字を見る。
  1941.     bsr    first_check_a5_in_line
  1942.  * 数字なら            d0 = 0
  1943.  * 行の終わりなら        d0 = -1
  1944.  * その他なら            d0 = そのキャラクタ
  1945.  
  1946.     move.w    (a2)+,d2    * parameter get
  1947.     bge    @f
  1948.     cmpi.w    #$8080,d2    * 配列拡張
  1949.     beq    拡張配列の引き数
  1950.     bra    fnc_loop_end    * 返り値
  1951.  
  1952. @@:
  1953.     tst.b    d2
  1954.     bge    @f
  1955.  * 省略可能な引き数
  1956.     cmpi.b    #',',d0
  1957.     beq    引き数省略
  1958.     cmpi.b    #')',d0
  1959.     beq    引き数省略
  1960.  
  1961. @@:
  1962.     moveq    #$60,d0
  1963.     and.b    d2,d0
  1964.     bne    配列の引き数
  1965.  
  1966.     btst    #4,d2
  1967.     bne    ポインタの引き数
  1968.  
  1969.     btst    #0,d2
  1970.     bne    float引き数
  1971.     btst    #1,d2
  1972.     bne    int引き数
  1973.     btst    #2,d2
  1974.     bne    char引き数
  1975.     btst    #3,d2
  1976.     bne    str引き数
  1977.     ERROR    19
  1978.  
  1979. float引き数:
  1980.     move.w    #$8080,d2
  1981.     bra    @f
  1982. char引き数:
  1983.     move.w    #$8002,d2
  1984.     bra    @f
  1985. str引き数:
  1986.     move.w    #$8001,d2
  1987.     bra    @f
  1988. int引き数:
  1989.     move.w    #$8000,d2
  1990.  
  1991. @@:
  1992.     move.w    d2,(a3)+
  1993.     addq.w    #2,d1
  1994.     ror.w    #8,d2
  1995.     clr.b    d2
  1996.  
  1997.  
  1998.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  1999.  * int        d2.w    = 0000
  2000.  * str        d2.w    = 0100
  2001.  * char     d2.w    = 0200
  2002.  * float    d2.w    = 8000
  2003.  * 型未判明    d2.w    = ffff
  2004.     movem.l    d1/a2,-(sp)
  2005.     bsr    math解釈
  2006.     movem.l    (sp)+,d1/a2
  2007.  *    return  d6.w    = 変数の型
  2008.  
  2009.     add.l    d0,d1
  2010.  
  2011.     bra    fnc_loop
  2012.  
  2013.  
  2014. 引き数省略:
  2015.     move.w    #$00ff,(a3)+
  2016.     addq.w    #2,d1
  2017.     bra    fnc_loop
  2018.  
  2019.  
  2020.  * d0.b = $20    1次元配列
  2021.  * d0.b = $40    2次元配列
  2022. 配列の引き数:
  2023.     movem.l    d1/a2/a3,-(sp)
  2024.     movem.w    d0/d2,-(sp)
  2025.     bsr    hash
  2026.     tst.w    d4
  2027.     blt    hennahikisu
  2028.  *        d4.l = * (hash.w)(文字数-1)
  2029.  *         a2.l = 元の対象の開始アドレス
  2030.     bsr    variable_check
  2031.  * 重なってない        d2.l    = -1
  2032.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  2033.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2034.  * char の n 番と一致    d2.l    = n+0200
  2035.  * float の n 番と一致    d2.l    = n+8000
  2036.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2037.  * d0 =   0 : 普通の変数
  2038.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2039.  *    $80 : auto 変数
  2040.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2041.  *     -1 : 当たりなし
  2042.     bmi    hennahikisu
  2043.     btst    #0,d0
  2044.     beq    hennahikisu
  2045.     move.b    d0,d3
  2046.  
  2047.     move.w    (sp)+,d0        * 要求している次元
  2048.  
  2049.     move.w    $a(a0),d1    * 指定された配列の次元
  2050.     beq    @f
  2051.     subq.w    #1,d1
  2052.     bne    hennahikisu        * 3次元以上の配列は駄目
  2053.     btst    #6,d0
  2054.     bne    fnc_1
  2055.     bra    hennahikisu
  2056. @@:
  2057.     btst    #5,d0
  2058.     beq    hennahikisu
  2059. fnc_1
  2060.  
  2061.     move.w    (sp)+,d0        * 引き数の型
  2062.     movem.l    (sp)+,d1/a2/a3
  2063.     bsr    引き数型check
  2064.  
  2065.     move.b    #$40,d2        * 配列の引き数
  2066.     tst.b    d3
  2067.     bpl    @f
  2068.     addq.b    #1,d2        * auto 配列の引き数
  2069. @@:
  2070.     ror.w    #8,d2
  2071.     swap    d2        * 下位=配列番号
  2072.     move.l    d2,(a3)+
  2073.     addq.w    #4,d1
  2074.     bra    fnc_loop
  2075.  
  2076.  
  2077. 拡張配列の引き数:
  2078.     movem.l    d1/a2/a3,-(sp)
  2079.     bsr    hash
  2080.     tst.w    d4
  2081.     blt    hennahikisu
  2082.  *        d4.l = * (hash.w)(文字数-1)
  2083.  *         a2.l = 元の対象の開始アドレス
  2084.     bsr    variable_check
  2085.  * 重なってない        d2.l    = -1
  2086.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  2087.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2088.  * char の n 番と一致    d2.l    = n+0200
  2089.  * float の n 番と一致    d2.l    = n+8000
  2090.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2091.  * d0 =   0 : 普通の変数
  2092.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2093.  *    $80 : auto 変数
  2094.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2095.  *     -1 : 当たりなし
  2096.     bmi    hennahikisu    * 未宣言
  2097.     btst    #0,d0        * 配列
  2098.     beq    hennahikisu
  2099.     movem.l    (sp)+,d1/a2/a3
  2100.  
  2101.     move.w    (a2)+,d4    * 型+次元-1
  2102.     moveq    #$f,d3
  2103.     and.w    d4,d3        * 次元-1
  2104.     clr.b    d4        * 型
  2105.  
  2106.     cmp.w    d2,d4
  2107.     bne    hennahikisu    * 型が合わない
  2108.     cmp.w    $a(a0),d3
  2109.     bne    dim_jigen    * 次元が合わない
  2110.  
  2111.     move.b    #$40,d2        * 配列の引き数
  2112.     tst.b    d0
  2113.     bpl    @f
  2114.     addq.b    #1,d2        * auto 配列の引き数
  2115. @@:
  2116.     ror.w    #8,d2
  2117.     swap    d2        * 下位=配列番号
  2118.     move.l    d2,(a3)+
  2119.     addq.w    #4,d1
  2120.  
  2121.  
  2122.     move.w    (a2)+,d4    * 添字指定フラグ
  2123.     lea.l    12(a0),a0    * その配列の添字列
  2124. 1:
  2125.     add.w    d4,d4
  2126.     bcc    @f
  2127.     move.w    (a2),d0        * 添字指定の大きさ(あれば)
  2128.     cmp.w    (a0),d0
  2129.     bne    dim_soeji    * 添字が合わない
  2130. @@:
  2131.     addq.l    #2,a0
  2132.     addq.l    #2,a2
  2133.     dbra    d3,1b
  2134.  
  2135.     bra    fnc_loop
  2136.  
  2137.  
  2138.  
  2139.  
  2140. ポインタの引き数:
  2141.  * ということは、必ず「代入出来る」変数名を指定してるはずだ
  2142.  
  2143.     move.w    d2,-(sp)
  2144.     movem.l    d1/a2/a3,-(sp)
  2145.     bsr    hash
  2146.     tst.w    d4
  2147.     blt    hennahikisu
  2148.  *        d4.l = * (hash.w)(文字数-1)
  2149.  *         a2.l = 元の対象の開始アドレス
  2150.     bsr    variable_check
  2151.     movem.l    (sp)+,d1/a2/a3
  2152.  * 重なってない        d2.l    = -1
  2153.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  2154.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2155.  * char の n 番と一致    d2.l    = n+0200
  2156.  * float の n 番と一致    d2.l    = n+8000
  2157.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2158.  * d0 =   0 : 普通の変数
  2159.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2160.  *    $80 : auto 変数
  2161.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2162.  *     -1 : 当たりなし
  2163.     tst.l    d2
  2164.     bmi    hennahikisu
  2165.     btst    #0,d0
  2166.     bne    hennahikisu
  2167.     move.b    d0,d3
  2168.  
  2169.     move.w    (sp)+,d0        * 引き数の型
  2170.     bsr    引き数型check
  2171.  
  2172.     move.b    #$60,d2        * ポインタの引き数
  2173.     tst.b    d3
  2174.     bpl    @f
  2175.     addq.b    #1,d2        * auto 変数のポインタの引き数
  2176. @@:
  2177.     ror.w    #8,d2
  2178.     swap    d2        * 下位=変数番号
  2179.     move.l    d2,(a3)+
  2180.     addq.w    #4,d1
  2181.     bra    fnc_loop
  2182.  
  2183.  
  2184.  
  2185.  
  2186.  
  2187.  
  2188.  
  2189.  
  2190. fnc_loop_end:
  2191.     cmpi.b    #')',d0
  2192.     bne    fnc_err
  2193.     addq.l    #1,a5
  2194.  
  2195.     move.w    (sp)+,(a3)+    *  0 から始まる関数番号
  2196.  
  2197.     move.l    d1,d0
  2198.     movem.l    (sp)+,d4-d6
  2199.     rts
  2200.  
  2201.  
  2202.  
  2203.  
  2204.  * X-BASIC format の型指定と、ぺけBのが一致するかどうか
  2205. 引き数型check:
  2206.     btst    #0,d0
  2207.     beq    @f
  2208.     cmpi.w    #$8000,d2
  2209.     beq    arg_check_ok
  2210. @@:
  2211.     btst    #1,d0
  2212.     beq    @f
  2213.     tst.w    d2
  2214.     beq    arg_check_ok
  2215. @@:
  2216.     btst    #2,d0
  2217.     beq    @f
  2218.     cmpi.w    #$0200,d2
  2219.     beq    arg_check_ok
  2220. @@:
  2221.     btst    #3,d0
  2222.     beq    @f
  2223.     cmpi.w    #$0100,d2
  2224.     beq    arg_check_ok
  2225. @@:
  2226. hennahikisu:
  2227.     ERROR    18
  2228.  
  2229. arg_check_ok:
  2230.     rts
  2231.  
  2232. dim_soeji:
  2233.     ERROR    74
  2234. dim_jigen:
  2235.     ERROR    75
  2236. fnc_err:
  2237.     ERROR    16
  2238. 型違い:
  2239.     ERROR    31
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.     .end
  2247.  
  2248.